package com.example.test06;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import java.util.Random;

@Component
@Aspect
public class OrderAspect {

    @Pointcut("execution(* com.example.test06.OrderService.*(..))")
    public void orderPointcut() {}

    // 1. 前置增强（未修改）
    @Before("orderPointcut()")
    public void beforeAdvice() {
        System.out.println("【前置增强】hello, 我是一个前置增强");
    }

    // 2. 后置增强（修改后：确保add/delete执行成功后必触发）
    @AfterReturning("execution(* com.example.test06.OrderService.add(..)) || " +
            "execution(* com.example.test06.OrderService.delete(..))")
    public void afterAdvice() {
        System.out.println("【后置增强】bye, 我是一个后置增强");
    }

    // 3. 返回值增强（修改后：明确区分有无返回值）
    @AfterReturning(pointcut = "orderPointcut()", returning = "result")
    public void afterReturningAdvice(Object result) {
        if (result != null) {
            System.out.println("【返回值增强】方法返回值：" + result);
        } else {
            System.out.println("【返回值增强】方法返回值：无返回值");
        }
    }

    // 4. 执行时间增强（未修改）
    @Around("orderPointcut()")
    public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
        long startTime = System.currentTimeMillis();
        Object result = joinPoint.proceed();
        long endTime = System.currentTimeMillis();
        System.out.println("【执行时间增强】方法执行时间：" + (endTime - startTime) + "毫秒");
        return result;
    }

    // 5. 权限校验（未修改）
    @Before("execution(* com.example.test06.OrderService.add(..)) || " +
            "execution(* com.example.test06.OrderService.delete(..))")
    public void permissionCheck(JoinPoint joinPoint) {
        int permission = new Random().nextInt(2);
        if (permission == 1) {
            String methodName = joinPoint.getSignature().getName();
            System.out.println("【权限校验】权限不足，禁止执行" + methodName + "方法！");
            throw new RuntimeException("无权限执行此操作");
        } else {
            System.out.println("【权限校验】权限通过，可以执行操作");
        }
    }
}
    